package gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;

import javax.swing.JComponent;

import map.MapEvent;
import map.MapHeightEvent;
import map.MapListener;
import map.MapResolutionEvent;
import map.MapWidthEvent;
import mapelements.background.Background;
import mapelements.foreground.Foreground;

/** Il righello che compare ai bordi del Display.
 * @author Daniele
 * @version 1.0. */
public class Ruler extends JComponent implements MapListener{

	private static final long serialVersionUID = -8224647680646156354L;
	
	private static final Color BLUEBAR = new Color(30, 0, 200);
	
	/** Costante intera per indicare un orientamento orizzontale del righello. */
	private static final int HORIZONTAL = 0;
	/** Costante intera per indicare un orientamento verticale del righello. */
	private static final int VERTICAL = 1;
	/** Spessore del righello. */
	private static final int SIZE = 10;
	
	/** L'orientamento orizzontale o verticale del righello. */
	private int orientation;
	/** Passo del righello. */
	private int increment;
	
	/** Costruisce un righello orientato orizzontalmente o verticalmente in accordo
	 *  con _orientation e con passo delle tacche uguale a _increment.
	 * @param _orientation  l'orientamento del righello: 0 = orizz. oppure 1 = vert. 
	 * @param _increment    la spaziatura tra le tacche del righello. */
	public Ruler(int _orientation, int _increment){
		this.orientation = _orientation;
		this.increment = _increment;
	}
	
	/** Imposta la dimensione preferita di un righello verticale,
	 *  una volta specificata la sua lunghezza preferita.
	 * @param ph la lunghezza preferita del righello. */
	public void setPreferredHeight(int length) {
        setPreferredSize(new Dimension(SIZE, length));
    }

	/** Imposta la dimensione preferita di un righello orizzontale,
	 *  una volta specificata la sua lunghezza preferita.
	 * @param pw la lunghezza preferita del righello. */
    public void setPreferredWidth(int length) {
        setPreferredSize(new Dimension(length, SIZE));
    }
	
    /** Setter per l'increment.
     * @param _increment l'increment da impostare. */
    public void setIncrement(int _increment){
    	this.increment = _increment;
    }
    
    /** Getter per l'increment.
     * @return l'increment. */
    public int getIncrement(){
    	return this.increment;
    }
    
	public void paintComponent(Graphics g){
		
		// Ottengo il rettangolo che delimita l'area che occuperà il righello (header di JScrollPane) e lo coloro.
		Rectangle drawHere = g.getClipBounds();
		g.setColor(BLUEBAR);
		g.fillRect(drawHere.x, drawHere.y, drawHere.width, drawHere.height);
		g.setColor(Color.WHITE);
		
		int start;   // variabile che segna l'inizio del righello.
		int end;	 // variabile che segna la fine del righello.
		
		// Stabilisco cosa si intende con start e end per i due casi di orientation.
		if(this.orientation == VERTICAL){
			start = drawHere.x + increment;
			end = drawHere.width;
		} else {
			start = drawHere.y + increment;
			end = drawHere.height;
		}
		
		// Traccio le tacche del righello, spaziate di increment.
		for(int i = start; i < end; i += increment){
			if(this.orientation == VERTICAL){
				g.drawLine(i, SIZE/2, i, SIZE-1);
			} else {
				g.drawLine(SIZE/2, i, SIZE-1, i);
			}
		}
	}

	@Override
	public void mapresolutionChanged(MapResolutionEvent arg0) {
		this.increment = arg0.getNewvalue();
		this.repaint();
	}

	@Override
	public void widthChanged(MapWidthEvent arg0) {
	}

	@Override
	public void heightChanged(MapHeightEvent arg0) {
	}

	@Override
	public void backgroundChanged(MapEvent<Background> arg0) {
	}

	@Override
	public void foregroundChanged(MapEvent<Foreground> arg0) {
	}
}
